package com.example.templatedemo

import android.util.Log
import com.example.lib_common.base.BaseMvvmFragment
import com.example.templatedemo.data.model.User
import com.example.templatedemo.databinding.FragmentHomeBinding
import com.example.templatedemo.observable.FieldLiveData

class HomeFragment : BaseMvvmFragment<FragmentHomeBinding, MainVM>() {

    companion object {
        val userLiveData = FieldLiveData<User>()
    }

    private val name = this::class.java.simpleName

    /**
     * Fragment对用户可见时调用
     */
    override fun onFragmentShow() {
        Log.d("BaseMvvmFragment", "$name 对用户可见时调用")
    }

    /**
     * Fragment对用户不可见时调用
     */
    override fun onFragmentHide() {
        Log.d("BaseMvvmFragment", "$name 对用户不可见时调用")
    }

    /**
     * Fragment首次对用户可见时调用
     */
    override fun onFragmentFirstShow() {
        Log.d("BaseMvvmFragment", "$name 首次对用户可见时调用")
    }

    override fun initView() {


// 观察整个对象（值不同才触发）
        userLiveData.observe(viewLifecycleOwner, { user ->
            Log.d("BaseMvvmFragment", "observeWhole $user")
        })
// 观察 name 属性，即使没变化也触发
        userLiveData.observeField(
            viewLifecycleOwner,
            User::name,
            observer = { Log.d("BaseMvvmFragment", "name变化: $it") },
//            { a, b -> a.equals(b) }
        )

        // 定义一个 observer 变量（必须是可复用的）
        val nameObserver: (String?) -> Unit = { newName ->
            Log.d("BaseMvvmFragment", "Forever观察到 name 变化: $newName")
        }
        userLiveData.observeFieldForever(
            User::name,
            observer = { Log.d("BaseMvvmFragment", "Forever观察到 name变化: $it") },
//            { a, b -> a.equals(b) }
        )

//// 自定义比较逻辑：只看是否包含字母变化（忽略大小写）
//        userLiveData.observeField(
//            viewLifecycleOwner,
//            User::name,
//            compare = { old, new -> old?.lowercase() == new?.lowercase() },
//            observer = { println("name变化(忽略大小写): $it") })

        mBinding.put.setOnClickListener {
            // 更新数据
            userLiveData.postValue(User("Jane", 26))
//            val bool = MMKVUtil.set("set", listOf("1","2","3","da").toSet())
//            Logger.d("set:" + bool)
        }
        mBinding.get.setOnClickListener {
            userLiveData.postValue(User("Jane1", 27))
//            userLiveData.removeFieldObserver(User::name,nameObserver)
//            val bool = MMKVUtil.get("set", listOf(1,2,3).toSet())
//            Logger.d("get:" + bool)
        }

    }
}